Per l'utilizzo con il sistema MARS (Mobile Agent Reactive Spaces) sono
utilizzati solo i tre seguenti package di SOMA:
AgentSystem
GateWay
PlaceManager
Ogni place di SOMA è fornito di uno spazio di tuple MARS.
Gli agenti di SOMA possono acquisire un riferimento allo spazio MARS
per mezzo dell'istruzione
Space main = PlaceManager.P.TupleSpace(myId);
dove il parametro myId di classe AgentIdentity indica il ruolo
dell'agente.
Alla classe PlaceManager.Place sono state aggiunte le seguenti
linee:
import jive.javaSpace.*;
import java.security.Principal;
public class Place {
...
private SpaceKernel TupleSpace;
public Place(String nome) {
...
TupleSpace = MARS.init(Nome);
}
public Space TupleSpace(Principal id)
throws SecurityException {
return TupleSpace.createReactiveSpace(id);
}
public Space PassiveTupleSpace(Principal
id)
throws SecurityException {
return TupleSpace.createPassiveSpace(id);
}
...}
Nella versione originale di SOMA gli agenti migrano da un place
ad un
altro, cioè di ogni agente esiste una sola istanza.
Per molti compiti, tra cui quello di ricerca di informazioni
presentato nell'Esempio 1, è necessario che gli agenti creino più
copie di sé, cioè è necessario che siano in grado di clonarsi.
A tale scopo è stato modificato il meccanismo di mobilità degli
agenti, in modo tale che l'agente non venga rimosso dal place di
partenza, dopo che ne è stata creata una copia sul place di
destinazione.
Nella classe AgentSystem.AgentSystem, metodi go, le istruzioni
AgentManager.dispose(agid,ag.getClass().toString());
sono state eliminate.
Nella versione originale di SOMA viene installato il Security Manager
di default. Poiché MARS usa i metodi RMI per la chiamata di metodi
remoti, nella versione modificata di SOMA viene installato il Security
Manager per RMI.
Nella classe AgentSystem.SecurityMan, metodo init, la
linea
System.setSecurityManager(new SecurityManager());
è stata sostituita con
System.setSecurityManager(new RMISecurityManager());
L'invocazione dei metodi degli agenti viene gestita attraverso
gli strumenti della reflection di Java.
Le eccezioni lanciate dall'interno di un tale metodo sono inglobate
in
un'eccezione di tipo InvocationTargetException, quando l'eccezione
originaria esce dal metodo. La modifica effettuata permette di
recuperare l'eccezione originaria e si è rivelata molto utile in fase
di debugging.
Nella classe AgentSystem.Worker, metodo run, le linee
try {
first.invoke(My_Agent,null);
} catch (Exception e) {
e.printStackTrace();
sono state sostituite con
try {
first.invoke(My_Agent,null);
} catch (InvocationTargetException
e) {
e.getTargetException().printStackTrace();
Per ovviare a errori a tempo di compilazione e d'esecuzione sono
state
effettuate due modifiche a SOMA.
La classe AgentSystem.NodeName è ora dichiarata public.
La classe Starter è stata spostata nel package AgentSystem.